package main

import (
	"fmt"
	"strconv"
)

func main() {
	// if 条件语句
	/**
	关于 if 条件语句的使用有一些规则：

	if 后面的条件表达式不需要使用 ()，这和有些编程语言不一样，也更体现 Go 语言的简洁；

	每个条件分支（if 或者 else）中的大括号是必须的，哪怕大括号里只有一行代码（如示例）；

	if 紧跟的大括号 { 不能独占一行，else 前的大括号 } 也不能独占一行，否则会编译不通过；

	在 if……else 条件语句中还可以增加多个 else if，增加更多的条件分支。

	*/
	i := 10
	if i > 10 {
		fmt.Println("i>10")
	} else {
		fmt.Println("i<=10")
	}
	/**
	和其他编程语言不同，在 Go 语言的 if 语句中，可以有一个简单的表达式语句，并将该语句和条件语句使用分号 ; 分开。同样是以上的示例，我使用这种方式对其改造，如下面代码所示：
	*/
	if a := 1; a > 1 {
		fmt.Println("a>1")
	} else if a == 1 {
		fmt.Println("a=1")
	} else {
		fmt.Println("a<1")
	}

	// switch 关键句
	/**
	if 条件语句比较适合分支较少的情况，如果有很多分支的话，选择 switch 会更方便，比如以上示例，使用 switch 改造后的代码如下

	switch 语句同样也可以用一个简单的语句来做初始化，同样也是用分号 ; 分隔。每一个 case 就是一个分支，分支条件为 true 该分支才会执行，而且 case 分支后的条件表达式也不用小括号 () 包裹。

	*/
	switch i := 6; {
	case i > 10:
		fmt.Println("i>10")
	case i > 5 && i <= 10:
		fmt.Println("5<i<=10")
	default:
		fmt.Println("i<=5")
	}

	/**
	在 Go 语言中，switch 的 case 从上到下逐一进行判断，一旦满足条件，立即执行对应的分支并返回，其余分支不再做判断。也就是说 Go 语言的 switch 在默认情况下，case 最后自带 break。这和其他编程语言不一样，比如 C 语言在 case 分支里必须要有明确的 break 才能退出一个 case。Go 语言的这种设计就是为了防止忘记写 break 时，下一个 case 被执行。

	那么如果你真的有需要，的确需要执行下一个紧跟的 case 怎么办呢？Go 语言也考虑到了，提供了 fallthrough 关键字。现在看个例子，如下面的代码所示：
	*/
	switch j := 1; {
	case j < 1:
		fmt.Println("j<1")
	case j == 1:
		fmt.Println("j==1")
		fallthrough
	case j < 3:
		fmt.Println("j<3")
	default:
		fmt.Println("default")
	}

	/**
	当 switch 之后有表达式时，case 后的值就要和这个表达式的结果类型相同，比如这里的 j 是 int 类型，那么 case 后就只能使用 int 类型，如示例中的 case 1、case 2。如果是其他类型，比如使用 case "a" ，会提示类型不匹配，无法编译通过。

	而对于 switch 后省略表达式的情况，整个 switch 结构就和 if……else 条件语句等同了。

	switch 后的表达式也没有太多限制，是一个合法的表达式即可，也不用一定要求是常量或者整数。你甚至可以像如下代码一样，直接把比较表达式放在 switch 之后：
	*/
	switch 2 > 1 {
	case true:
		fmt.Println("2>1")
	case false:
		fmt.Println("2<=1")
	}

	// for循环
	/**
	第一部分是一个简单语句，一般用于 for 循环的初始化，比如这里声明了一个变量，并对 i:=1 初始化；
	第二部分是 for 循环的条件，也就是说，它表示 for 循环什么时候结束。这里的条件是 i<=100；
	第三部分是更新语句，一般用于更新循环的变量，比如这里 i++，这样才能达到递增循环的目的。
	*/
	sum := 0
	for i = 0; i <= 100; i++ {
		sum += i
	}
	fmt.Println(sum)
	fmt.Println("sum:" + strconv.Itoa(sum))

	/**
	需要特别留意的是，Go 语言里的 for 循环非常强大，以上介绍的三部分组成都不是必须的，可以被省略，下面我就来为你演示，省略以上三部分后的效果。
	如果你以前学过其他编程语言，可能会见到 while 这样的循环语句，在 Go 语言中没有 while 循环，但是可以通过 for 达到 while 的效果，如以下代码所示：

	在 Go 语言中，同样支持使用 continue、break 控制 for 循环：
	continue 可以跳出本次循环，继续执行下一个循环。
	break 可以跳出整个 for 循环，哪怕 for 循环没有执行完，也会强制终止。
	*/
	i = 0
	for i < 100 { // 这里写 for i=1;i<100 分号赋值会报错
		i++
	}
	fmt.Println(i)

}
